//
//  DemoJson.m
//  ocdemo
//
//  Created by JIENING ZHANG on 2019/6/11.
//  Copyright © 2019 JIENING ZHANG. All rights reserved.
//

#import "DemoJson.h"
#import "NSString+GGJson.h"
#import "NSObject+GGJson.h"

@implementation DemoJson

+ (void)demoLogic {
    /*
     NSJSONSerialization功能：
        JSON数据转换为Foundation对象（一般都是NSDictionary和NSArray）和
        Foundation对象转换为JSON数据（可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据）

    转换成JSON的对象必须具有如下属性：
        1.顶层对象必须是NSArray或者NSDictionary
        2.所有的对象必须是NSString、NSNumber、NSArray、NSDictionary、NSNull
        3.所有NSDictionary的key必须是NSString类型
        4.数字对象不能是非数值或无穷（NSNumber）

    相关参数介绍：
    1. NSJSONReadingOptions
        NSJSONReadingMutableContainers  创建可变的数组或字典 接收
        NSJSONReadingMutableLeaves      指定在JSON对象可变字符串被创建为NSMutableString的实例
        NSJSONReadingAllowFragments     指定解析器应该允许不属于的NSArray或NSDictionary中的实例顶层对象
     
    2. NSJSONWritingOptions
        NSJSONWritingPrettyPrinted的意思是将生成的json数据格式化输出，这样可读性高，不设置则输出的json字符串就是一整行。

    3.NSDictionary中的key就是json字符串中的key，object就是json字符串中的value，
     */
    
    NSArray *monthArr = @[
                          @"January",
                          @"February",
                          @"March",
                          @"April",
                          @"May",
                          @"June",
                          @"July",
                          @"August",
                          @"September",
                          @"October",
                          @"November",
                          @"December",
                          ];

    NSDictionary *monthDic = @{
                               @"January" :     @(31),
                               @"February" :    @(28),
                               @"March" :       @(31),
                               @"April" :       @(30),
                               @"May" :         @(31),
                               @"June" :        @(30),
                               @"July" :        @(31),
                               @"August" :      @(31),
                               @"September" :   @(30),
                               @"October" :     @(31),
                               @"November" :    @(30),
                               @"December" :    @(31),
                               };
    
    NSDictionary *testDic = @{@"arr" : monthArr,
                              @"dic" : monthDic,
                              @"str" : @"\"zhang\""
                              };
    
    
    // ns 对象 --> nsdata --> nsstring
    NSError *err;
    if( [NSJSONSerialization isValidJSONObject:testDic] ) {
        
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:testDic options:NSJSONWritingPrettyPrinted error:&err];
        NSLog(@"jsonData length: %lu", [jsonData length]);
        if(jsonData.length > 0) {
            NSString* jsonString =  [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
            NSLog(@"jsonString : %@", jsonString);
        }
    }
    
    // nsstring --> nsdata --> ns 对象
    NSString *jsonArrStr = @"[\"January\", \"March\", \"May\", \"July\", \"August\", \"October\", \"December\", {\"less31\":{\"February\":28, \"April\":30, \"June\":30, \"September\":30, \"November\":30}}]";
    
    NSData *jsonArrData = [jsonArrStr dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"jsonArrData length: %lu", [jsonArrData length]);
    
    id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonArrData options:NSJSONReadingMutableContainers error:&err];
    if([jsonObj isKindOfClass:[NSArray class]]) {
        NSLog(@"jsonObj : %@", jsonObj);
    } else {
        NSLog(@"JSONObjectWithData, error : %@", err);
    }
    
    // nsstring --> ns 对象, using category
    id jsonObjFromStr = [jsonArrStr ggJsonObj];
    if(jsonObjFromStr) {
        NSLog(@"jsonObjFromStr : %@", jsonObjFromStr);
    }
    
    // ns 对象 --> nsstring, using category
    NSString *jsonStrFromObj = [testDic ggJsonString];
    if(jsonStrFromObj.length > 0) {
        NSLog(@"jsonStrFromObj : %@", jsonStrFromObj);
    }
    
    NSString *jsonStrPrettyFromObj = [testDic ggJsonStringPrettty];
    if(jsonStrPrettyFromObj.length > 0) {
        NSLog(@"jsonStrPrettyFromObj : %@", jsonStrPrettyFromObj);
    }
}
@end
